package com.gadgets.busi.bm03.process.impl.sql;

import com.gadgets.busi.bm03.common.Bm03Constant;
import com.gadgets.busi.bm03.common.dto.ExcelRowProcessDTO;
import com.gadgets.busi.bm03.common.dto.sql.ColumnInfoDTO;
import com.gadgets.busi.bm03.common.dto.sql.IndexInfoDTO;
import com.gadgets.framework.common.constant.GadgetsExceptionConstant;
import com.gadgets.framework.common.exception.GadgetsValidateException;
import com.gadgets.framework.common.util.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;

@Component
public class RowMore5SqlProcess extends AbstractRowSqlProcess{

    public RowMore5SqlProcess() {
        super(5);
    }

    @Override
    protected boolean judege(String taskType, int rowNum) {
        return getModuelType().equals(taskType) && this.getRowNum()<=rowNum;
    }

    @SuppressWarnings({"unchecked", "ConstantConditions"})
    @Override
    protected void realExcute(Row row, HashMap<String, Object> data, ExcelRowProcessDTO excelRowProcessDTO) {
        logger.info("当前第{}行，开始读取",row);
        // 获取列信息容器
        List<ColumnInfoDTO> columnInfoDTOList = (List<ColumnInfoDTO>) excelRowProcessDTO.getParamMap().get(Bm03Constant.SQL_GEN_TASK_PARAM_KEY.COLUMN);
        // 获取索引信息容器
        List<IndexInfoDTO> indexInfoDTOList = (List<IndexInfoDTO>) excelRowProcessDTO.getParamMap().get(Bm03Constant.SQL_GEN_TASK_PARAM_KEY.INDEX);
        // 获取表名，用于拼接其他名称使用
        String tableNameOrg = (String) excelRowProcessDTO.getParamMap().get(Bm03Constant.SQL_GEN_TASK_PARAM_KEY.TABLE_NAME);
        String tableName = tableNameOrg.replace("T_","").replace("_","");
        // 开始读取Excel内容
        int columnNum = 1;
        ColumnInfoDTO columnInfoDTO = null;
        for (Cell cell : row) {
            switch (columnNum){
                case 1:{
                    // 第1列A是字段名
                    columnInfoDTO = getColumnName(excelRowProcessDTO, columnInfoDTO, cell);
                    break;
                }
                case 2:{
                    // 第2列B是字段说明
                    getColumnComment(columnInfoDTO, cell);
                    break;
                }
                case 4:{
                    // 第4列D是字段类型
                    getColumnType(columnInfoDTO, cell);
                    break;
                }
                case 6:{
                    // 第6列F是单列约束
                    getUniqueColumnIndexInfo(indexInfoDTOList, tableName, columnInfoDTO, cell);
                    break;
                }
                case 7:{
                    // 第7列G是默认值
                    getColumnDefaultValue(columnInfoDTO, cell);
                    break;
                }
                case 8:{
                    // 第8列H是属性类型
                    getJavaParamType(columnInfoDTO, cell);
                    break;
                }
                case 9:{
                    // 第9列I是属性名称
                    getJavaParamName(columnInfoDTO, cell);
                    break;
                }
                case 11:{
                    // 第11列J是组合键约束，第12列K是组合字段
                    getGroupColumnIndexInfo(row, indexInfoDTOList, tableName, columnInfoDTO, cell);
                    break;
                }
                default:
                    break;
            }
            columnNum++;
        }
        // 如果列信息不为空，则将列信息加入到容器中
        if(null!=columnInfoDTO){
            columnInfoDTOList.add(columnInfoDTO);
        }
    }

    protected void getGroupColumnIndexInfo(Row row, List<IndexInfoDTO> indexInfoDTOList, String tableName, ColumnInfoDTO columnInfoDTO, Cell cell) {
        String indexType = cell.getStringCellValue();
        if(!StringUtils.isBlank(indexType)) {
            IndexInfoDTO indexInfoDTO = new IndexInfoDTO();
            indexInfoDTO.setIndexType(indexType);
            indexInfoDTO.setIndexName(tableName +"_"+ columnInfoDTO.getColumnName());
            // 从第11列获取组合键的组合字段
            Cell unionKeyColumn = row.getCell(11);
            String unionKeyColumnString = unionKeyColumn.getStringCellValue();
            if(!StringUtils.isBlank(unionKeyColumnString)){
                indexInfoDTO.setIndexColumnName(unionKeyColumnString.split(","));
            }else{
                throw new GadgetsValidateException(GadgetsExceptionConstant.VALIDATE_ERROR,"当存在组合键时，组合字段不允许为空");
            }
            indexInfoDTOList.add(indexInfoDTO);
        }
    }

    protected void getColumnDefaultValue(ColumnInfoDTO columnInfoDTO, Cell cell) {
        cell.setCellType(CellType.STRING);
        String defaultVal = cell.getStringCellValue();
        if(!StringUtils.isBlank(defaultVal)){
            columnInfoDTO.setDefaultValue(defaultVal);
        }
    }

    protected void getJavaParamName(ColumnInfoDTO columnInfoDTO, Cell cell) {
        cell.setCellType(CellType.STRING);
        String paramName = cell.getStringCellValue();
        if(!StringUtils.isBlank(paramName)){
            columnInfoDTO.setJavaParamName(paramName);
        }
    }

    protected void getJavaParamType(ColumnInfoDTO columnInfoDTO, Cell cell){
        cell.setCellType(CellType.STRING);
        String paramName = cell.getStringCellValue();
        if(!StringUtils.isBlank(paramName)){
            columnInfoDTO.setJavaParamType(paramName);
        }
    }

    protected void getUniqueColumnIndexInfo(List<IndexInfoDTO> indexInfoDTOList, String tableName, ColumnInfoDTO columnInfoDTO, Cell cell) {
        String indexType = cell.getStringCellValue();
        if(!StringUtils.isBlank(indexType)) {
            IndexInfoDTO indexInfoDTO = new IndexInfoDTO();
            indexInfoDTO.setIndexColumnName(new String[]{columnInfoDTO.getColumnName()});
            indexInfoDTO.setIndexType(indexType);
            indexInfoDTO.setIndexName(tableName +"_"+ columnInfoDTO.getColumnName());
            indexInfoDTOList.add(indexInfoDTO);
        }
    }

    protected void getColumnType(ColumnInfoDTO columnInfoDTO, Cell cell) {
        String dataType = cell.getStringCellValue();
        columnInfoDTO.setColumnDataType(dataType);
    }

    protected void getColumnComment(ColumnInfoDTO columnInfoDTO, Cell cell) {
        String columnComment = cell.getStringCellValue();
        columnInfoDTO.setColumnComment(columnComment);
    }

    protected ColumnInfoDTO getColumnName(ExcelRowProcessDTO excelRowProcessDTO, ColumnInfoDTO columnInfoDTO, Cell cell) {
        String columnName = cell.getStringCellValue();
        if(!StringUtils.isBlank(columnName)){
            columnInfoDTO = new ColumnInfoDTO();
            columnInfoDTO.setColumnName(columnName);
        }else{
            // 为了兼容空行，如果存在空行就跳过不再执行
            excelRowProcessDTO.getParamMap().put("end",true);
        }
        return columnInfoDTO;
    }

}
